package main

import (
	"flag"
	"fmt"
	"image"
	"image/gif"
	_ "image/gif"
	"image/jpeg"
	_ "image/jpeg"
	"image/png"
	_ "image/png"
	"io"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	//定义命令行标识符
	outputFormat := flag.String("output", "jpeg", "输出图像格式(jpeg, png, gif)")

	quality := flag.Int("quality", 95, "JPEG图像质量(1-100)")
	flag.Parse()

	//拿到参数， 定义读写接口
	// 检查是否有额外的参数（输入文件）
	args := flag.Args()
	var input io.Reader
	var output io.Writer

	if len(args) > 0 {
		file, err := os.Open(args[0])
		if err != nil {
			fmt.Fprintf(os.Stderr, "错误: 无法打开输入文件: %v\n", err)
			os.Exit(1)
		}

		//关闭文件
		defer file.Close()
		input = file

		// 如果有第二个参数，输出到文件
		if len(args) > 1 {
			outFile, err := os.Create(args[1])
			if err != nil {
				fmt.Fprintf(os.Stderr, "错误: 无法创建输出文件: %v\n", err)
				os.Exit(1)
			}
			defer outFile.Close()
			output = outFile
		} else {
			// 如果没有指定输出文件，尝试基于输入文件名生成
			ext := filepath.Ext(args[0])
			base := strings.TrimSuffix(args[0], ext)
			outFile, err := os.Create(base + "." + *outputFormat)
			if err != nil {
				fmt.Fprintf(os.Stderr, "错误: 无法创建输出文件: %v\n", err)
				os.Exit(1)
			}
			defer outFile.Close()
			output = outFile
		}

	} else {
		// 从标准输入读取，输出到标准输出
		input = os.Stdin
		output = os.Stdout
	}

	if err := convertImage(input, output, *outputFormat, *quality); err != nil {
		fmt.Fprintf(os.Stderr, "错误: %v\n", err)
		os.Exit(1)
	}

}

func convertImage(in io.Reader, out io.Writer, format string, quality int) error {
	// 解码输入图像
	img, kind, err := image.Decode(in)
	if err != nil {
		return fmt.Errorf("解码图像失败: %v", err)
	}
	fmt.Fprintf(os.Stderr, "输入格式: %s\n", kind)

	// 根据指定的格式编码输出图像
	switch strings.ToLower(format) {
	case "jpeg", "jpg":
		return jpeg.Encode(out, img, &jpeg.Options{Quality: quality})
	case "png":
		return png.Encode(out, img)
	case "gif":
		return gif.Encode(out, img, &gif.Options{})
	default:
		return fmt.Errorf("不支持的输出格式: %s", format)
	}
}
